/*
 * File:   lcdxx.h
 * Author: aple
 */

#ifndef lcd_xh_H
#define	lcd_xh_H

#include "stdint.h"
#include "mytype.h"

#ifdef	__cplusplus
extern "C" {
#endif

#define TEXT_X_LEFT     0x00       //文本左对齐
#define TEXT_X_MID      0x01       //文本居中对齐
#define TEXT_X_RIGHT    0x02       //文本右对齐
#define TEXT_Y_UP       (0x00<<2)  //文本上对齐
#define TEXT_Y_MID      (0x01<<2)  //文本中对齐
#define TEXT_Y_DOWN     (0x02<<2)  //文本下对齐

#define TEXT_MID        (TEXT_X_MID | TEXT_Y_MID)
#define TEXT_LEFT_DOWN  (TEXT_X_LEFT | TEXT_Y_DOWN)
#define TEXT_LEFT_UP    (TEXT_X_LEFT | TEXT_Y_UP)
#define TEXT_RIGHT_DOWN  (TEXT_X_RIGHT | TEXT_Y_DOWN)
#define TEXT_RIGHT_UP    (TEXT_X_RIGHT | TEXT_Y_UP)

#define TEXT_SQ_W(n)    ((n)<<4)       //文本加方框,x代表线宽 	(0-3)
#define TEXT_SQ_PX(n)   ((n)<<6)       //文本方框文字间隔 		(0-7)
#define TEXT_SQ_PY(n)   ((n)<<9)       //文本方框文字间隔 		(0-7)
#define TEXT_SQ(w,px,py)    (TEXT_SQ_W(w) | TEXT_SQ_PX(px) | TEXT_SQ_PY(py))

#define TEXT_LINE_N(n)  ((n)<<12)       //文本加线，x代表线数      (0-3)
#define TEXT_LINE_W(n)  ((n-1)<<14)      //文本加线，x代表线宽  (1-4)
#define TEXT_LINE(w,n)   (TEXT_LINE_W(w) | TEXT_LINE_N(n))


	/*******************************************************************************
	*  图像采样
	*  Byte0              Byte1
	*  b8 b7 ... b1 b0    b8 b7 ... b1 b0
	*
	*
	*  画布数据排列，x向排布，字节内bit高位在前，映射至物理屏左侧
	*  Byte0              Byte1
	*  b8 b7 ... b1 b0    b8 b7 ... b1 b0
	*
	*****************************************************************************/

	extern const unsigned char Font_6_12[];
	extern const unsigned char Font_8_16[];
	extern const unsigned char Font_12_24[];
	extern const unsigned char Font_16_32[];
	extern const unsigned char Font_24_48[];
	extern const unsigned char Font_32_64[];
	extern const unsigned char Font_48_96[];
	extern const unsigned char Font_64_128[];

	/******************************************************************************
	 * 基本设置接口
	 *****************************************************************************/
	void lcd_xh_init(void);
	void lcd_xh_disp_buff_set(uu8 *pbuff);//设置画布显存，必须在调用绘制API前设置
	void lcd_xh_font_set(uu8 Fontx, uu8 Fonty, const uu8 *Ascii); //x,y must be mul of 2  (y=8-56)(x=8-blocks*blocksize)，必须在绘制字符、文字前设置
	void lcd_xh_half_en(void);//小数点半显
	void lcd_xh_half_dis(void);//小数点正常显示
	void lcd_xh_anti(void);//反显
	void lcd_xh_normal(void);//正显
	void lcd_xh_space_set(uu8 Space);//字符串间距
	void lcd_xh_origin_set(ii16 x0, ii16 y0);//绘制相对原点设置。接口所有xy坐标均受控，page不受控

	/******************************************************************************
	 * 绘制图形接口，基于画布操作，不受物理屏幕限制。
	 * API中所有 x y坐标在画布中的的实际位置为 (x+x0, y+y0)。x0、y0是 lcd_xh_origin_set 设置的原点。
	 * API中的page是画布中的页编号，和相对原点无关。
	 *****************************************************************************/
	void lcd_xh_put_space(ii16 x, ii16 y, ii8 Amounts); //绘制空格
	void lcd_xh_put_char(ii16 x, ii16 y, char DispCh); //绘制ASCII字符
	void lcd_xh_put_cn(ii16 x, ii16 y, const uu8 *pCN); //绘制中文
	void lcd_xh_puts(ii16 x, ii16 y, const char *DispStr);   //绘制ASCII字符串
	void lcd_xh_put_nums(ii16 x, ii16 y, const char *DispStr);  //点阵顺序 0123456789.-+  //注意最后一个是空格
	void lcd_xh_put_cns(ii16 x, ii16 y, ii8 Amount, const uu8 *pCN); //绘制中文文本
	void lcd_xh_dot_set(ii16 x, ii16 y);//设置点
	void lcd_xh_dot_clr(ii16 x, ii16 y);//清除点
	void lcd_xh_ram_fill(uu8 Val);//全显存内容
	void lcd_xh_line(ii16 x0, ii16 y0, ii16 x1, ii16 y1);//绘制线
	void lcd_xh_square(ii16 x0, ii16 y0, ii16 x1, ii16 y1);//绘制矩形
	void lcd_xh_square_fill(ii16 x0, ii16 y0, ii16 x1, ii16 y1);//绘制填充矩形
	void lcd_xh_imgage_quick(ii16 x0, ii16 y0, ii16 wide, ii16 high, const uu8 *pImg);
	void lcd_xh_circle(ii16 x, ii16 y, ii16 r);

	// 带对齐及框线选项的文本显示
	void lcd_xh_alain_puts(ii16 x, ii16 y, const char *DispStr, uu16 mode);   //绘制ASCII字符串
	void lcd_xh_alain_put_nums(ii16 x, ii16 y, const char *DispStr, uu16 mode);  //点阵顺序 0123456789.-+  //注意最后一个是空格
	void lcd_xh_alain_put_cns(ii16 x, ii16 y, ii8 Amount, const uu8 *pCN, uu16 mode); //绘制中文文本
	dword_tt lcd_xh_alain_xy_get(ii16 x, ii16 y, const char *DispStr, ii16 cn_num, uu16 mode); // x=lw, y=hw
	void lcd_xh_alain_sq_and_line(ii16 x, ii16 y, ii16 text_wide, uu16 mode);

	// 混合显示，需 TS3 GB2312 字库支持
	void lcd_xh_alain_ext_puts(ii16 x, ii16 y, const char *str, uu16 mode);
	extern const uu8 * lcd_xh_gb2312_cn_get(uu32 mem_offset, uu16 font_x); //extern function

	/******************************************************************************
	 * 底层输出接口
	 * 截取画布显示，该接口须实现 lcd_data_write硬件输出
	 * disp_page: 截取起始页
	 * x0:截取画布x方向相对位置,以指针为基点
	 *****************************************************************************/
	void lcd_xh_poll(uu16 x0, uu16 y0, uu8 y_amount); //将显存数据输出到端口
	uu8 lcd_xh_update_cnt_get(void);

	/******************************************************************************/

	/*-外部依赖-*/
	void lcd_hal_init(void);
	/****************************************************************************
	 * The flowing function can be run independently.
	 * Other functions rely on these functions.
	 * so if you delete it, some functions may not work.
	 ****************************************************************************/
	void lcd_data_write(short y, short xoffset, uu8 const * pdata);


#ifdef	__cplusplus
}
#endif

#endif	/* lcd_xh_H */

